package com.benchmark.springboot.controller;

import com.benchmark.springboot.enums.ErrorCodeEnum;
import com.power.common.model.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.WebAsyncTask;

import java.util.concurrent.Callable;

import static java.lang.Thread.sleep;

/**
 * WebAsyncTask
 *
 * @author yu 2019/2/17.
 */
@Slf4j
@RestController
@RequestMapping("webAsyncTask")
public class WebAsyncTaskController {


    /**
     * webAsyncTask返回执行结果
     *
     * @return
     */
    @GetMapping("callable")
    public WebAsyncTask<CommonResult<String>> testWebAsyncTask() {
        log.info("使用WebAsyncTask");
        Callable<CommonResult<String>> callable = () -> {
            sleep(1000); //模拟长时间任务
            log.info("执行业务逻辑");
            return CommonResult.ok().setResult("Hello WebAsyncTask");
        };
        return new WebAsyncTask<>(callable);
    }

    /**
     * WebAsyncTask  Completion处理
     *
     * @return
     */
    @GetMapping("/completion")
    public WebAsyncTask<CommonResult> asyncTaskCompletion() {
        log.info("WebAsyncTask  Completion处理测试");

        // 模拟开启一个异步任务，超时时间为10s
        WebAsyncTask<CommonResult> asyncTask = new WebAsyncTask<>(10 * 1000L, () -> {
            // 任务处理时间5s，不超时
            sleep(5 * 1000L);
            log.info("execute task");
            return CommonResult.ok().setResult("Hello WebAsyncTask  Completion.");
        });

        // 任务执行完成时调用该方法
        asyncTask.onCompletion(() -> log.info("任务执行完成"));
        log.info("继续处理其他事情");
        return asyncTask;
    }

    /**
     * WebAsyncTask  Exception处理
     *
     * @return
     */
    @GetMapping("/exception")
    public WebAsyncTask<CommonResult> asyncTaskException() {
        log.info("WebAsyncTask  Exception处理测试");
        // 模拟开启一个异步任务，超时时间为10s
        WebAsyncTask<CommonResult> asyncTask = new WebAsyncTask<>(10 * 1000L, () -> {
            log.info("执行业务处理");
            // 任务处理时间5s，不超时
            sleep(5 * 1000L);
            throw new Exception("抛出异常");
        });

        // 任务执行完成时调用该方法
        asyncTask.onCompletion(() -> log.info("任务执行完成"));
        asyncTask.onError(() -> {
            log.error("任务执行异常");
            return CommonResult.fail();
        });

        log.info("继续处理其他事情");
        return asyncTask;
    }

    /**
     * WebAsyncTask超时测试
     *
     * @return
     */
    @GetMapping("/timeout")
    public WebAsyncTask<CommonResult> asyncTaskTimeout() {
        log.info("WebAsyncTask  timeout处理测试");
        // 模拟开启一个异步任务，超时时间为10s
        WebAsyncTask<CommonResult> asyncTask = new WebAsyncTask<>(5 * 1000L, () -> {
            log.info("执行业务处理");
            // 任务处理时间5s，不超时
            Thread.sleep(6 * 1000L);
            return CommonResult.ok().setResult("webAsyncTask");
        });

        // 任务执行完成时调用该方法
        asyncTask.onCompletion(() -> log.info("任务执行完成"));
        asyncTask.onTimeout(() -> {
            log.error("任务执行异常");
            return CommonResult.fail(ErrorCodeEnum.TIME_OUT);
        });

        log.info("继续处理其他事情");
        return asyncTask;
    }
}
